﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MylambdaLinqDemo
{
    public delegate void NoReturnNoParaOutClass();
    public delegate void GenericDelegate<T>();
    public class LambdaShow
    {
        public delegate void NoReturnNoPara(); //委托的本质是个类
        public delegate void NoReturnWithPara(int x, string y);//1 声明委托
        public delegate int WithReturnNoPara();
        public delegate string WithReturnWithPara(out int x, ref int y);

        public void Show()
        {

            //一.形似于c => c.Equals("") 就是Lambad


            List<string> list = new List<string>();
            list.Where(c => c.Equals(""));

            //一、Lambda究竟是怎么来的？
            //.NET Framework1.0时代 ---有委托
            {
                int i = 1;
                NoReturnNoPara mehthd = new NoReturnNoPara(this.DoNothing);
                mehthd.Invoke();

            }

            //.NET Framework2.0时代  --匿名方法
            //1.实例化委托的时候，支持写入一个delegate关键字，直接把方法体写入到委托的实例中来
            //2.可以访问方法体以外的变量

            //匿名方法
            {
                int i = 1;
                NoReturnNoPara mehthd = new NoReturnNoPara(delegate
                {
                    Console.WriteLine(i);
                    Console.WriteLine("This is DoNothing");
                });
                mehthd.Invoke();
            }

            //.NET Framework 3.0 时代  升级  delegate换成 =>  goes to  
            {
                int i = 1;
                NoReturnNoPara mehthd = new NoReturnNoPara(() =>
                {
                    Console.WriteLine(i);
                    Console.WriteLine("This is DoNothing");
                });
                mehthd.Invoke();

            }
            //.NET Framework3.0 后期  继续升级
            {
                int i = 1;
                NoReturnNoPara mehthd = () =>
                {
                    Console.WriteLine(i);
                    Console.WriteLine("This is DoNothing");
                };
                mehthd.Invoke();

            }
            //Lambada表达式的样子
            {
                //如果匿名方法内部只有一行代码；省略大括号

                int i = 1;
                NoReturnNoPara mehthd = () => Console.WriteLine(i);
                mehthd.Invoke();

                //参数的类型可以省略---编译器提供的便捷功能---语法糖
                NoReturnWithPara method1 = (id, name) => Console.WriteLine($"{id} {name} 学习.Net高级班");
            }

            //Lambad表达式的本质是什么？   
            //lambda 不是委托--- 是一个匿名方法
         
        }

        private int ToInt()
        {
            return 123;
        }

        /// <summary>
        /// 明确声明的方法---有名称的
        /// </summary>
        private void DoNothing()
        {
            //this.i
            Console.WriteLine("This is DoNothing");
        }

        private void Study(int id, string name)
        {
            //Console.WriteLine(i);
            Console.WriteLine($"{id} {name} 学习.Net高级班");
        }
    }
}
